package com.collabscm.waf.domain.repository;

import java.io.Serializable;
import java.util.List;

import com.collabscm.waf.solution.persistence.DynamicQueryBuilder;
import com.collabscm.waf.solution.profiler.Monitor;
import com.collabscm.waf.vo.PageObject;
import com.collabscm.waf.vo.QueryParameters;

/**
 * 数据访问对象接口，提供对基础的CRUD方法。
 * 
 * @author Zeng Raoxing
 */
public interface DatabaseRepository <T, PK extends Serializable> {

    /** 
     * 对一个新的实例进行持久化处理。
     * 注意：新生成的主键将直接赋值给newInstance，因此如果需要得到主键的信息，
     * 那么就直接通过newInstance的响应方法取得即可。 
     * 
     * @param newInstance 新建的实例
     */
	@Monitor(uptime=100)
    void create(T newInstance);

    /** 
     * 更新实体对象
     * 
     * @param transientObject 未在持久态的对象
     */
	@Monitor(uptime=100)
    void update(T transientObject);

    /** 
     * 删除实体对象 
     * 
     * @param persistentObject 已在数据库中持久的对象
     */
	@Monitor(uptime=100)
    void delete(T persistentObject);
    
    /**
     * 通过ID删除对象
     * 
     * @param id
     */
	@Monitor(uptime=100)
    void deleteById(PK id);

    /** 
     * 根据主键得到一个实体对象
     * 
     * @param id 主键对象
     */
	@Monitor(uptime=100)
    T find(PK id);
    
    /**
     * 根据Model内中定义的NamedQuery或NamedNativeQuery查询结果，此方法为全部查询处理，没有进行分段处理，
     * 需分段处理的方法请参见：findNamedQuery(String namedQuery, QueryParameters queryParameters)
     * 
     * @param namedQuery model类中定义的@NamedQuery或@NamedNativeQuery
     * @see findNamedQuery(String namedQuery, QueryParameters queryParameters)
     */
	@Monitor(uptime=500)
    List<T> findNamedQuery(String namedQuery);
    
    /**
     * 根据Model内中定义的NamedQuery或NamedNativeQuery查询结果，并添加各类参数，包括：分页、入参等。
     * 
     * @param namedQuery model类中定义的@NamedQuery或@NamedNativeQuery
     * @param queryParameters 查询的参数
     */
	@Monitor(uptime=500)
    List<T> findNamedQuery(String namedQuery, QueryParameters queryParameters);
    
    /**
     * 根据Model内中定义的NamedQuery或NamedNativeQuery查询总数
     * 
     * @param namedQuery model类中定义的@NamedQuery或@NamedNativeQuery
     */
	@Monitor(uptime=200)
    long findNamedQueryCount(String namedQuery);
    /**
     * 查询总数数量
     * 
     * @param namedQuery model类中定义的@NamedQuery或@NamedNativeQuery
     * @param queryParameters 查询的参数
     */
	@Monitor(uptime=500)
    long findNamedQueryCount(String namedQuery, QueryParameters queryParameters);
	
	/**
	 * 根据查询直接查询出PageObject对象
	 * 
	 * @param queryParameters 查询条件
	 * @return
	 */
	PageObject<T> findPageObject(QueryParameters queryParameters);
	
	/**
	 * 根据查询直接查询出PageObject对象
	 * 
	 * @param namedQuery      查询结果
	 * @param countNamedQuery 查询总数的SQL
	 * @param queryParameters 参数
	 * @return
	 */
	PageObject<T> findPageObjectByNamedQuery(String namedQuery, String countNamedQuery, QueryParameters queryParameters);
	
	/**
	 * 
	 * @return
	 */
	DynamicQueryBuilder getDynamicQueryBuilder();
	
}
